//package cn.yiynx.example.util.low;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.transaction.PlatformTransactionManager;
//import org.springframework.transaction.TransactionStatus;
//import org.springframework.transaction.support.DefaultTransactionDefinition;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.atomic.AtomicBoolean;
//
///**
// * @author Huangzk
// * @date 2023/9/20 19:06
// */
//public class LowImport {
//    @Autowired
//    private PlatformTransactionManager transactionManager;
//
//    public static volatile boolean IS_OK = true;
//
//    @Test
//    public void batchHandle() {
//        //主线程等待所有子线程执行完成
//        int threadCount = 5;
//        CountDownLatch childMonitor = new CountDownLatch(threadCount);
//        //主线程收集到的子线程最终结果
//        List<Boolean> childResponse = new ArrayList<>();
//        //子线程在该对象上等待主线程通知
//        CountDownLatch mainMonitor = new CountDownLatch(1);
//        //注意：线程数一定大于批次数，如果批次数进入队列则会无限期等待
//        ExecutorService executorService = Executors.newFixedThreadPool(5);
//        // 定义一个原子布尔值作为信号量
//        AtomicBoolean rollbackSignal = new AtomicBoolean(false);
//
//        //批次
//        for (int i = 0; i < threadCount; i++) {
//            executorService.execute(() -> {
//                //开启事务
//                TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
//
//                try {
//                    try {
//                        userService.saveBatch(buildStudentList());
//                        childResponse.add(Boolean.TRUE);
//                        log.info("线程[{}]正常执行完成，等待其他线程执行结束，判断是否需要回滚", Thread.currentThread().getName());
//                    } catch (Exception e) {
//                        childResponse.add(Boolean.FALSE);
//                    } finally {
//                        childMonitor.countDown();
//                    }
//
//                    try {
//                        mainMonitor.await();
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//
//                    if (IS_OK) {
//                        log.info("所有线程都正常完成, 线程[{}]事务提交", Thread.currentThread().getName());
//                        transactionManager.commit(transactionStatus);
//                    } else {
//                        log.info("有现成出现异常, 线程[{}]事务回滚", Thread.currentThread().getName());
//                        transactionManager.rollback(transactionStatus);
//                    }
//                } catch (TransactionException e) {
//                    log.error("线程[{}]发生了异常,开始进行事务回滚", Thread.currentThread().getName());
//                    transactionManager.rollback(transactionStatus);
//                }
//            });
//        }
//
//        //主线程等待所有子线程执行完成
//        try {
//            childMonitor.await();
//            for (Boolean resp : childResponse) {
//                if (!resp) {
//                    //如果有一个子线程执行失败了,则改变mainResult,让所有子线程回滚
//                    log.info("[{}]: IS_OK的值被修改为false", Thread.currentThread().getName());
//                    IS_OK = false;
//                    break;
//                }
//            }
//        } catch (Exception e) {
//
//        } finally {
//            //主线程获取结果成功,让子线程开始根据主线程的结果执行(提交或回滚)
//            mainMonitor.countDown();
//        }
//    }
//
//    public List<Users> buildStudentList(){
//        List<Users> subTasks = new ArrayList<>();
//        for (int i = 0; i < 5; i++) {
//            Users users = new Users();
//            users.setUsername("handler" + i);
//            subTasks.add(users);
//        }
//        return subTasks;
//    }
//}
